package pe.com.hermes.hermetic.negocio.service;

import java.sql.SQLException;

import java.util.Collection;

import org.springframework.validation.BindingResult;

import pe.com.hermes.hermetic.beans.CargaPedidoBean;
import pe.com.hermes.hermetic.beans.CargaPedidoLineaBean;
import pe.com.hermes.hermetic.beans.PedidoAjaxBean;
import pe.com.hermes.hermetic.modelo.dao.PedidoDAO;
import pe.com.hermes.hermetic.web.forms.HMF3007Form;

import java.util.List;

import java.util.Map;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import pe.com.hermes.hermetic.beans.ArchPedidosAgrupadosBean;
import pe.com.hermes.hermetic.beans.CargaPedidoFormattedBean;
import pe.com.hermes.hermetic.beans.CuentaBean;
import pe.com.hermes.hermetic.beans.RepoAbastDetaBean;
import pe.com.hermes.hermetic.beans.TiposBean;
import pe.com.hermes.hermetic.negocio.managerimpl.pedido.tv.PedidoTvContainerManagerImpl;
import pe.com.hermes.hermetic.negocio.managerimpl.pedido.tv.PedidoTvManagerImpl;
import pe.com.hermes.hermetic.web.forms.HMF3014Form;
import pe.com.hermes.pedidotxclient.modelo.bean.PedidoBean;
import pe.com.hermes.unidadesnegocio.comercial.entities.ClienteEntity;
import pe.com.hermes.unidadesnegocio.general.response.common.CampoResponse;
import pe.com.hermes.unidadesnegocio.operaciones.entities.CompServMantEntity;
import pe.com.hermes.unidadesnegocio.procesamiento.entities.DenominacionEntity;
import pe.com.hermes.unidadesnegocio.procesamiento.entities.PedidoDenoEntity;
import pe.com.hermes.unidadesnegocio.procesamiento.entities.PedidoEntity;
import pe.com.hermes.unidadesnegocio.procesamiento.entities.PedidoLogEntity;
import pe.com.hermes.unidadesnegocio.procesamiento.managerimpl.PedidoAbstract;
import pe.com.hermes.unidadesnegocio.procesamiento.managerimpl.PedidoContainerAbstract;

public interface PedidoService {
    public HSSFWorkbook excelListadoPedido(HMF3007Form form);
    public List getListPedidoByFecHorClieAndSucu(String codCliente,String codSucursal,String fecSoliPedi,String horSoliPedi);
    public String getCodDiarioEncriptByClie(String codClie);
    public String getCodDiarioByClieDesencriptado(String codDiarioEncr);
    public HSSFWorkbook excelRegistrarPedido(Map parameters);
    public HSSFWorkbook excelRegistrarAtmPedido(PedidoContainerAbstract pedidosContainer);
    public HSSFWorkbook excelMostrarPedidosAtm(PedidoContainerAbstract pedidosContainer, HMF3014Form form);
    public HSSFWorkbook excelMostrarPedidosPredAtm(PedidoContainerAbstract pedidosContainer, HMF3014Form form, String chk_repo);
    public PedidoDAO getPedidoDAO();
  
    /*JRA REQ1614 Carga masiva de pedidos ATM*/
    public Map validarArchivoPedidoATM(MultipartFile file,String extension);
    public List validarTxtPedidoATM(MultipartFile file);
    public Map validarXlsPedidoATM(MultipartFile file);
    public Map validarXlsxPedidoATM(MultipartFile file);
    public Map cargarArchivoATM(MultipartFile file,MultipartHttpServletRequest request, String extension, Integer numLineaFin);
    public Map cargarArchivoTxtATM(MultipartFile file,MultipartHttpServletRequest request);
    public Map cargarArchivoXlsATM(MultipartFile file,MultipartHttpServletRequest request, Integer numLineaFin);
    public Map cargarArchivoXlsxATM(MultipartFile file,MultipartHttpServletRequest request, Integer numLineaFin);
    /*Fin Carga Masiva de Pedidos ATM*/
    
    /*JRA REQ1614 Validaciones para Pedidos de ATM*/
    public String getCodCajeroFromCodBanco(String codSucu,String codClie,String codAtmBanco);
    public CampoResponse validaCodAtmBanco(String codSucu,String codClie,String codAtmBanco);
    public CampoResponse validaFecProc(String codSucu,String codClie,String codCnta,String codCajero,String fecProc);    
    public CampoResponse validaFecAten(String codSucu,String codClie,String codCajero,String fecAten);
    public Map validaHoraAten(String codSucu,String codClie,String codCajero,String fecAten,String horaAten);    
    public CampoResponse validaHoraAtenParam(String codSucu,String codClie,String codCajero,String fecAten,String horaAten,String codPrio,Integer tipPrio);
    public CampoResponse validaDenomPediATM(Double denom);
    public CampoResponse validaCodDispen(String codSucu,String codClie,String codCajero,String codDispen,
                                        String tip_unid_mone,Double codDeno,String horaAten);    
    public CampoResponse validaMontoDispen(String codSucu,String codClie,String codCnta,String codCajero,String codDispen,
                                        String tip_unid_mone,Double codDeno,String fecProc,Double monto);
    
    public Integer getCbmcParmValo(Integer codSucuHtb,Integer numParm);
    public CampoResponse validaPorcPrioATM(String codSucu,String codClie,String codCnta,Integer indPrio,Integer cantPrio,Integer cantTotl,String fecProc);
    
    /*Fin Validaciones REQ1614*/
    public List<CuentaBean> getCntaAtm(String codCliente,String codSucursal);
    public List<PedidoDenoEntity> getListDenoYSaldAtm(int codClie,int codSucuHtb, int codCnta,String fecProcAper,int codCjro,int tipBill);
    public int getNumPedi(String tipDocu,String codSeriPedi);
    public int inseTgCtrlNume(String tipDocu,String codSeriPedi,int  numPedi);
    public int getIndProgAtm(int codPunt,String fecAtenPedi,String horInicAtePact,String horFinAtenPact);    
    public int getCodClieFact(int codPunt,int codClieOrig,int codClieGrup,int codSucuHtb,int codCntaOrig);
    public int getBovedaDePedido(int codClie,int codSucuHtb,int codCntaOrig,int tipUnidMone,int tipMone);
    public void inseListPedi(Collection<? extends PedidoAbstract> pedidos) throws SQLException;
    public void inseListPediToAutorizar(Collection<? extends PedidoAbstract> pedidos)  throws SQLException;
    public int getIndConfAtmAuto(int codClie,int codPunt);
    public boolean isCuentaAtm(int codClie,int codSucuHtb,int codCnta);
    public List<PedidoAbstract> getListPredic(int codClie,int codSucuHtb, String fecPedi);
    public void sendMail(String remitente,Collection<String> destinatarios,String replyTo, String asunto,String textMessage);
    public List<String> getListMailNive(int codClieOrig, int codClieDest, int tipProc,int niveAuto);
    public PedidoAbstract getRetuPediAtmInter(String tipDocuPedi,String codSeriPedi,int numPedi);
    public int inseArchPediClie(int codClie, String fecCarg,String rutOrig,String rutDestServ,String rutDestWLSR,String nomArch,String estArch,int numHojas,String nomComp, String codUsua);
    public List<ArchPedidosAgrupadosBean> consArchPediClie(int codClie, String fecInic,String fecFinl,int estArch);
    public int updtArchPediClie(int codArchPedi,int estArch,String nomComp,String codUsua);
    public PedidoAbstract getRetuPedi(String tipDocuPedi,String codSeriPedi,int numPedi);  
    public List<DenominacionEntity> getListDenoAbasATMMap();
  public Map getFaltSobrAbastATM(String numCmpb,String codSeriCmpb,String tipDocuCmpb,String numCmpbRemaSol,String
                                 codSeriRemaSol,String tipDocuRemaSol,String numCmpbRemaDol,String codSeriRemaDol,
                                 String tipDocuRemaDol,String origDocu,String orig,int codSucuHtb,double monRemeSole,double monRemeDola);
    public List<RepoAbastDetaBean> getDetaRemeAbastATM(String numCmpb,String codSeriCmpb,String tipDocuCmpb,String numCmpbRemaSol,String
                                                     codSeriRemaSol,String tipDocuRemaSol,String numCmpbRemaDol,String codSeriRemaDol,
                                                       String tipDocuRemaDol,String origDocu,String orig);
    public List<RepoAbastDetaBean> getDetaRechAbastATM(String numCmpb,String codSeriCmpb,String tipDocuCmpb,String numCmpbRemaSol,String
                                                 codSeriRemaSol,String tipDocuRemaSol,String numCmpbRemaDol,String codSeriRemaDol,
                                                     String tipDocuRemaDol,String origDocu,String orig);
    public boolean clieHasNiveAuto(int codClieOrig, int codClieDest, int codSucuHtb,String tipProc) throws SQLException;
    public List<CompServMantEntity> getListCabeAbastATMMap(String fecInic,String fecFinl,int codClie,int codSucuHtb);
    public Double getPorcRemaAbastATM(String numCmpb,String codSeriCmpb,String tipDocuCmpb,int codSucuHtb,int tipUnidMone,String subTipoServ);
    public List<RepoAbastDetaBean> getDetaAbastATM(String numPedi,String codSeriPedi,String tipDocuPedi,String codServ,int codSucuHtb);
    public void inseLogAutoPedi(PedidoLogEntity pedidoLog)  throws SQLException;
    public TiposBean obtiHoraAten(String codSucu,String codClie,String codCajero,String fecAten,String horaAten);
    public CampoResponse validaCodAtmPunto(String codPunt);
    public int getNextMaxNumNive(int codClieOrig, int codClieDest, int codSucuHtb, String tipProc) throws Exception;
    public List savePedido(PedidoContainerAbstract pedidoContainer) throws Exception;
    public List<PedidoAbstract> getListPediTempTvBovProp (String listCodClie, String codSucuHtb, String tipRegiPedidos, int tipProc, int tipFecha ,String fechaDesde,String fechaHasta, String estado,int nivelAuto);
    public List<PedidoAbstract> getListPediTempTvBovBanc (String listCodClie, String listCodBanc, String codSucuHtb, String tipRegiPedidos, int tipProc, int tipFecha ,String fechaDesde,String fechaHasta, String estado,int nivelAuto, int numCateNive);
    public List<PedidoAbstract> getListPediTvBovProp (String listCodClie, String codSucuHtb, String tipRegiPedidos, int tipProc, int tipFecha ,String fechaDesde,String fechaHasta, String estado,int nivelAuto);
    public void confirmarPedidoTvList(Collection<? extends PedidoAbstract> pedidos) throws SQLException;
    public PedidoAbstract getRetuPediTvTemp(String tipDocuPedi,String codSeriPedi,int numPedi);
    public void aprovePediTempList(Collection<? extends PedidoAbstract> pedidos) throws SQLException;
    public void actuPendEstdPediTempList(Collection<? extends PedidoAbstract> pedidos) throws SQLException ;
    public int getNumNiveAuto(int codClieOrig, int codClieDest, int tipProc, int codSucuHtb);
    public void actuCateNivePediTemp(Collection<? extends PedidoAbstract> pedidos, int numCateNiveAuto, int numNiveAuto) throws SQLException ;
    public void rechazarPediList(Collection<? extends PedidoAbstract> pedidos) throws SQLException ;
    public void elimListPediTemp(Collection<? extends PedidoAbstract> pedidos) throws SQLException ;
    public  Map validarArchivoPedido(MultipartFile file, String extension, Map params);
    public Map cargarArchivoPedido(MultipartFile file, String extension, Map params);
    public List<CargaPedidoBean> generaEstructuraPedidos(List<CargaPedidoLineaBean> lista, BindingResult result);
    public Map validaEstructuraPedidos(List listEstructuraPedido, Map params);
    public List getPedidosEntity(List<CargaPedidoFormattedBean> listCargaPedidoLinea, Map params);
    public List<PedidoTvManagerImpl> getListDetaPedido(String numPedi,String codSeriPedi, String tipDocuPedi);
    
    public void modiListPediTvTemp(Collection<? extends PedidoAbstract> pedidos) throws SQLException;
    public void concatenarPedidos(Collection<PedidoAbstract> pedidos,Collection<PedidoAbstract> pedidosAgregar);
    public int modiDatoPediTemp(PedidoEntity pedido);
    public int getIndProg(int codClie, String fecAtenPedi, String horAtenInicPact);
    public CampoResponse validaFechaContable(final String fechaContable, final String cod_clie, final String cod_sucu_htb, final String cod_cnta);
    
    public CampoResponse validarFechaAtencion(String fecha, String hora);
    public List getListDenosByUnidMone(String tipUnidMone);
    public String getPersParmDinaClie(String codClie, String codSucuHtb, String codParm, String nomCamp);
    public String getCntaBancCome(String codBanco, String codSucuHtb);

    public HSSFWorkbook excelRegistrarPedidoCome(Map parameters);
    public HSSFWorkbook excelSustentoPedidoCome(Map parameters);

    public List<String> getListMailPediSucu(String codRazoSoci);
    public HSSFWorkbook excelSustentoPedido(Map parameters);
    public List getEstaLogNivPedi(String TipoDocu, String numPedi,  String codSeriPedi);
    public Map validarArchivoPedidoBB(MultipartFile file, String extension, Map params);
    public Map cargarArchivoPedidoBB(MultipartFile file, String extension,Map params);
    public Map validaEstructuraPedidosBB(List listEstrucPedidos, Map params);
    public List getListCargaFormatted(List listPedido);
    public Map getRepoBovPropDS(PedidoTvContainerManagerImpl pedidoContainer);
    public Map getRepoBovBancDS(PedidoTvContainerManagerImpl pedidoContainer);
}
